package br.com.dlm.simuladoitil.controle;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

import java.util.ArrayList;
import java.util.List;

import br.com.dlm.simuladoitil.basicas.Alternativa;
import br.com.dlm.simuladoitil.basicas.Categoria;
import br.com.dlm.simuladoitil.basicas.Questao;

public class RepositorioLocal extends SQLiteOpenHelper {

    public RepositorioLocal(Context context) {
        super(context, "db", null, 1);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        StringBuffer SQL_CREATE_CATEGORIAS = new StringBuffer();
        SQL_CREATE_CATEGORIAS.append(" CREATE TABLE CATEGORIAs ( ");
        SQL_CREATE_CATEGORIAS.append(" _id TEXT PRIMARY KEY ");
        SQL_CREATE_CATEGORIAS.append(" , nome TEXT NOT NULL ");
        SQL_CREATE_CATEGORIAS.append(" , descricao TEXT ");
        SQL_CREATE_CATEGORIAS.append(" ) ");

        Log.d("RepositorioLocal", SQL_CREATE_CATEGORIAS.toString());
        db.execSQL(SQL_CREATE_CATEGORIAS.toString());

        StringBuffer SQL_CREATE_QUESTOES = new StringBuffer();
        SQL_CREATE_QUESTOES.append(" CREATE TABLE QUESTOES ( ");
        SQL_CREATE_QUESTOES.append(" _id TEXT PRIMARY KEY ");
        SQL_CREATE_QUESTOES.append(" , pergunta TEXT NOT NULL ");
        SQL_CREATE_QUESTOES.append(" , respondida INTEGER NOT NULL ");
        SQL_CREATE_QUESTOES.append(" , categoria TEXT NOT NULL ");
        SQL_CREATE_QUESTOES.append(" , alternativa_correta TEXT NOT NULL ");
        SQL_CREATE_QUESTOES.append(" , FOREIGN KEY(categoria) REFERENCES CATEGORIAS(_id) ");
        SQL_CREATE_QUESTOES.append(" , FOREIGN KEY(alternativa_correta) REFERENCES ALTERNATIVAS(_id) ");
        SQL_CREATE_QUESTOES.append(" ) ");

        Log.d("RepositorioLocal", SQL_CREATE_QUESTOES.toString());
        db.execSQL(SQL_CREATE_QUESTOES.toString());

        StringBuffer SQL_CREATE_ALTERNATIVAS = new StringBuffer();
        SQL_CREATE_ALTERNATIVAS.append(" CREATE TABLE ALTERNATIVAS ( ");
        SQL_CREATE_ALTERNATIVAS.append(" _id TEXT PRIMARY KEY ");
        SQL_CREATE_ALTERNATIVAS.append(" , texto TEXT NOT NULL ");
        SQL_CREATE_ALTERNATIVAS.append(" , questao TEXT NOT NULL ");
        SQL_CREATE_ALTERNATIVAS.append(" , FOREIGN KEY(questao) REFERENCES QUESTOES(_id) ");
        SQL_CREATE_ALTERNATIVAS.append(" ) ");

        Log.d("RepositorioLocal", SQL_CREATE_ALTERNATIVAS.toString());
        db.execSQL(SQL_CREATE_ALTERNATIVAS.toString());
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    }

    public void inserirCategoria(Categoria categoria) {
        SQLiteDatabase db = getWritableDatabase();

        ContentValues contentValues = new ContentValues();
        contentValues.put("_id", categoria.id);
        contentValues.put("nome", categoria.nome);
        contentValues.put("descricao", categoria.descricao);

        db.insert("CATEGORIAS", null, contentValues);

        db.close();

        if (!categoria.questoes.isEmpty()) {
            int tamanhoListaQuestoes = categoria.questoes.size();
            for (int indexQuestao = 0; indexQuestao < tamanhoListaQuestoes; indexQuestao++) {
                inserirQuestao(categoria.questoes.get(indexQuestao), categoria);
            }
        }
    }

    public void inserirQuestao(Questao questao, Categoria categoria) {
        SQLiteDatabase db = getWritableDatabase();

        ContentValues contentValues = new ContentValues();
        contentValues.put("_id", questao.id);
        contentValues.put("pergunta", questao.pergunta);
        contentValues.put("respondida", questao.respondida == true ? 1 : 0);
        contentValues.put("categoria", categoria.id);
        contentValues.put("alternativa_correta", questao.idAlternativaCorreta);

        db.insert("QUESTOES", null, contentValues);

        db.close();

        if (!questao.alternativas.isEmpty()) {
            int tamanhoListaAlternativas = questao.alternativas.size();
            for (int indexAlternativa = 0; indexAlternativa < tamanhoListaAlternativas; indexAlternativa++) {
                inserirAlternativa(questao.alternativas.get(indexAlternativa), questao);
            }
        }
    }

    public void inserirAlternativa(Alternativa alternativa, Questao questao) {
        SQLiteDatabase db = getWritableDatabase();

        ContentValues contentValues = new ContentValues();
        contentValues.put("_id", alternativa.id);
        contentValues.put("texto", alternativa.texto);
        contentValues.put("questao", questao.id);

        db.insert("ALTERNATIVAS", null, contentValues);

        db.close();
    }

    public void alterarCategoria(Categoria categoria) {
        SQLiteDatabase db = getWritableDatabase();

        ContentValues contentValues = new ContentValues();
        contentValues.put("nome", categoria.nome);
        contentValues.put("descricao", categoria.descricao);

        String where = "_id = ?";
        String argumentos[] = {categoria.id};

        db.update("CATEGORIAS", contentValues, where, argumentos);

        db.close();
    }

    public void alterarQuestao(Questao questao, Categoria categoria) {
        SQLiteDatabase db = getWritableDatabase();

        ContentValues contentValues = new ContentValues();
        contentValues.put("pergunta", questao.pergunta);
        contentValues.put("respondida", questao.respondida == true ? 1 : 0);

        if (categoria != null) {
            contentValues.put("categoria", categoria.id);
        }

        contentValues.put("alternativa_correta", questao.idAlternativaCorreta);

        String where = "_id = ?";
        String argumentos[] = {questao.id};

        db.update("QUESTOES", contentValues, where, argumentos);

        db.close();
    }

    public void alterarAlternativa(Alternativa alternativa, Questao questao) {
        SQLiteDatabase db = getWritableDatabase();

        ContentValues contentValues = new ContentValues();
        contentValues.put("texto", alternativa.texto);

        if (questao != null) {
            contentValues.put("questao", questao.id);
        }

        String where = "_id = ?";
        String argumentos[] = {alternativa.id};

        db.update("ALTERNATIVAS", contentValues, where, argumentos);

        db.close();
    }

    public List<Categoria> listarCategorias() {
        List<Categoria> categorias = new ArrayList<Categoria>();

        SQLiteDatabase db = getReadableDatabase();

        Cursor cursor = db.rawQuery("SELECT * FROM CATEGORIAS", null);

        while (cursor.moveToNext()) {
            categorias.add( new Categoria(
                    cursor.getString(cursor.getColumnIndex("_id")),
                    cursor.getString(cursor.getColumnIndex("nome")),
                    cursor.getString(cursor.getColumnIndex("descricao")),
                    new ArrayList<Questao>()));
        }

        cursor.close();
        db.close();

        int tamanhoListaCategorias = categorias.size();
        for (int indexCategoria = 0; indexCategoria < tamanhoListaCategorias; indexCategoria++) {
            Categoria categoria = categorias.get(indexCategoria);
            categoria.questoes = consultarQuestoesPorCategoria(categoria);

            List<Questao> questoes = categoria.questoes;
            int tamanhoListaQuestoes = questoes.size();
            for (int indexQuestao = 0; indexQuestao < tamanhoListaQuestoes; indexQuestao++) {
                Questao questao = questoes.get(indexQuestao);
                questao.alternativas = consultarAlternativasPorQuestao(questao);
            }
        }
        return categorias;
    }

    public List<Questao> consultarQuestoesPorCategoria(Categoria categoria) {
        List<Questao> questoes = new ArrayList<Questao>();

        SQLiteDatabase db = getReadableDatabase();

        Cursor cursor = db.rawQuery("SELECT * FROM QUESTOES WHERE categoria = ?", new String[]{ categoria.id });

        while (cursor.moveToNext()) {
            Questao questao = new Questao(
                    cursor.getString(cursor.getColumnIndex("_id")),
                    cursor.getString(cursor.getColumnIndex("pergunta")),
                    new ArrayList<Alternativa>(),
                    cursor.getString(cursor.getColumnIndex("alternativa_correta")),
                    cursor.getInt(cursor.getColumnIndex("respondida")) == 1 ? true :false
            );

            questao.alternativas = consultarAlternativasPorQuestao(questao);

            questoes.add(questao);
        }

        return questoes;
    }

    public List<Alternativa> consultarAlternativasPorQuestao(Questao questao) {
        List<Alternativa> alternativas = new ArrayList<Alternativa>();

        SQLiteDatabase db = getReadableDatabase();

        Cursor cursor = db.rawQuery("SELECT * FROM ALTERNATIVAS WHERE questao = ?", new String[]{ questao.id });

        while (cursor.moveToNext()) {
            alternativas.add(new Alternativa(
                    cursor.getString(cursor.getColumnIndex("_id")),
                    cursor.getString(cursor.getColumnIndex("texto"))
            ));
        }

        return alternativas;
    }

    public Categoria consultarCategoriaPorId(String id) {
        SQLiteDatabase db = getReadableDatabase();

        Cursor cursor = db.rawQuery("SELECT * FROM CATEGORIAS WHERE _id = ?", new String[]{ id });

        Categoria categoria = null;

        while (cursor.moveToNext()) {
            categoria =  new Categoria(
                    cursor.getString(cursor.getColumnIndex("_id")),
                    cursor.getString(cursor.getColumnIndex("nome")),
                    cursor.getString(cursor.getColumnIndex("descricao")),
                    new ArrayList<Questao>());
        }
        if(categoria != null){
            categoria.questoes = consultarQuestoesPorCategoria(categoria);
        }
        return categoria;
    }

    public Questao consultarQuestaoPorId(String id) {
        SQLiteDatabase db = getReadableDatabase();

        Cursor cursor = db.rawQuery("SELECT * FROM QUESTOES WHERE _id = ?", new String[]{ id });

        Questao questao = null;

        while (cursor.moveToNext()) {
            questao =  new Questao(
                    cursor.getString(cursor.getColumnIndex("_id")),
                    cursor.getString(cursor.getColumnIndex("pergunta")),
                    new ArrayList<Alternativa>(),
                    cursor.getString(cursor.getColumnIndex("alternativa_correta")),
                    cursor.getInt(cursor.getColumnIndex("respondida")) == 1 ? true :false
            );
        }
        if(questao != null){
            questao.alternativas = consultarAlternativasPorQuestao(questao);
        }
        return questao;
    }

    public Alternativa consultarAlternativaPorId(String id) {
        SQLiteDatabase db = getReadableDatabase();

        Cursor cursor = db.rawQuery("SELECT * FROM ALTERNATIVAS WHERE _id = ?", new String[]{ id });

        Alternativa alternativa = null;

        while (cursor.moveToNext()) {
            alternativa = new Alternativa(
                    cursor.getString(cursor.getColumnIndex("_id")),
                    cursor.getString(cursor.getColumnIndex("texto"))
            );
        }
        return alternativa;
    }
}